home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 2010 April
/
PCWorld0410.iso
/
hity wydania
/
Ubuntu 9.10 PL
/
karmelkowy-koliberek-9.10-netbook-remix-PL.iso
/
casper
/
filesystem.squashfs
/
usr
/
share
/
software-center
/
softwarecenter
/
app.pyc
(
.txt
)
< prev
next >
Wrap
Python Compiled Bytecode
|
2009-10-28
|
18KB
|
465 lines
# Source Generated with Decompyle++
# File: in.pyc (Python 2.6)
import apt
import aptdaemon
import locale
import dbus
import dbus.service as dbus
import gettext
import locale
import logging
import glib
import gtk
import os
import subprocess
import sys
import xapian
from SimpleGtkbuilderApp import SimpleGtkbuilderApp
from softwarecenter.enums import *
from softwarecenter.version import *
from softwarecenter.db.database import StoreDatabase
import view.dialogs as view
from view.viewswitcher import ViewSwitcher, ViewSwitcherList
from view.pendingview import PendingView
from view.installedpane import InstalledPane
from view.availablepane import AvailablePane
from view.softwarepane import SoftwarePane
from apt.aptcache import AptCache
from gettext import gettext as _
class SoftwarecenterDbusController(dbus.service.Object):
'''
This is a helper to provide the SoftwarecenterIFace
It provides
'''
def __init__(self, parent, bus_name, object_path = '/com/ubuntu/Softwarecenter'):
dbus.service.Object.__init__(self, bus_name, object_path)
self.parent = parent
def bringToFront(self):
self.parent.window_main.present()
return True
bringToFront = dbus.service.method('com.ubuntu.SoftwarecenterIFace')(bringToFront)
class SoftwareCenterApp(SimpleGtkbuilderApp):
(NOTEBOOK_PAGE_AVAILABLE, NOTEBOOK_PAGE_INSTALLED, NOTEBOOK_PAGE_PENDING) = range(3)
WEBLINK_URL = 'http://apt.ubuntu.com/p/%s'
def __init__(self, datadir, xapian_base_path):
SimpleGtkbuilderApp.__init__(self, datadir + '/ui/SoftwareCenter.ui', 'software-center')
gettext.bindtextdomain('software-center', '/usr/share/locale')
gettext.textdomain('software-center')
try:
locale.setlocale(locale.LC_ALL, '')
except:
logging.exception('setlocale failed')
self.setup_dbus_or_bring_other_instance_to_front()
self.setup_database_rebuilding_listener()
try:
locale.setlocale(locale.LC_ALL, '')
except Exception:
e = None
logging.exception('setlocale failed')
pathname = os.path.join(xapian_base_path, 'xapian')
try:
self.db = StoreDatabase(pathname)
self.db.open()
except xapian.DatabaseOpeningError:
if os.path.isdir(pathname) and not os.listdir(pathname):
rebuild_database = rebuild_database
import softwarecenter.db.update
logging.info('building local database')
rebuild_database(pathname)
self.db = StoreDatabase(pathname)
self.db.open()
except xapian.DatabaseCorruptError:
e = None
logging.exception('xapian open failed')
view.dialogs.error(None, _('Sorry, can not open the software database'), _("Please re-install the 'software-center' package."))
sys.exit(1)
self.icons = gtk.icon_theme_get_default()
self.icons.append_search_path(ICON_PATH)
self.icons.append_search_path(SOFTWARE_CENTER_ICON_PATH)
self.icons.append_search_path(datadir + '/icons/32x32/status')
self.cache = AptCache()
self._pending_transactions = 0
self._block_menuitem_view = False
self._available_items_for_page = { }
self._selected_pkgname_for_page = { }
self._selected_appname_for_page = { }
self.available_pane = AvailablePane(self.cache, self.db, self.icons, datadir)
self.available_pane.app_details.connect('selected', self.on_app_details_changed, self.NOTEBOOK_PAGE_AVAILABLE)
self.available_pane.app_view.connect('application-selected', self.on_app_selected, self.NOTEBOOK_PAGE_AVAILABLE)
self.available_pane.connect('app-list-changed', self.on_app_list_changed, self.NOTEBOOK_PAGE_AVAILABLE)
self.alignment_available.add(self.available_pane)
self.installed_pane = InstalledPane(self.cache, self.db, self.icons, datadir)
self.installed_pane.app_details.connect('selected', self.on_app_details_changed, self.NOTEBOOK_PAGE_INSTALLED)
self.installed_pane.app_view.connect('application-selected', self.on_app_selected, self.NOTEBOOK_PAGE_INSTALLED)
self.installed_pane.connect('app-list-changed', self.on_app_list_changed, self.NOTEBOOK_PAGE_INSTALLED)
self.alignment_installed.add(self.installed_pane)
self.pending_view = PendingView(self.icons)
self.scrolledwindow_transactions.add(self.pending_view)
self.view_switcher = ViewSwitcher(datadir, self.icons)
self.scrolledwindow_viewswitcher.add(self.view_switcher)
self.view_switcher.show()
self.view_switcher.connect('view-changed', self.on_view_switcher_changed)
self.view_switcher.model.connect('transactions-changed', self.on_view_switcher_transactions_changed)
self.view_switcher.set_view(ViewSwitcherList.ACTION_ITEM_AVAILABLE)
try:
import LaunchpadIntegration as LaunchpadIntegration
LaunchpadIntegration.set_sourcepackagename('software-center')
LaunchpadIntegration.add_items(self.menu_help, 1, True, False)
except Exception:
e = None
logging.debug("launchpad integration error: '%s'" % e)
self.available_pane.searchentry.grab_focus()
def on_app_details_changed(self, widget, appname, pkgname, page):
self._selected_pkgname_for_page[page] = pkgname
self._selected_appname_for_page[page] = appname
self.update_app_status_menu()
self.update_status_bar()
def on_app_list_changed(self, pane, new_len, page):
self._available_items_for_page[page] = new_len
if self.notebook_view.get_current_page() == page:
self.update_status_bar()
def on_app_selected(self, widget, appname, pkgname, page):
self._selected_appname_for_page[page] = appname
self._selected_pkgname_for_page[page] = pkgname
self.menuitem_copy.set_sensitive(True)
self.menuitem_copy_web_link.set_sensitive(True)
def on_window_main_delete_event(self, widget, event):
gtk.main_quit()
def on_view_switcher_transactions_changed(self, view_switcher, pending_nr):
if pending_nr == 0 and self._view_before_pending_switch is not None:
if self.view_switcher.get_view() is None:
self.view_switcher.set_view(self._view_before_pending_switch)
self._view_before_pending_switch = None
elif pending_nr > 0 and self._pending_transactions == 0:
self._view_before_pending_switch = self.view_switcher.get_view()
self.view_switcher.set_view(ViewSwitcherList.ACTION_ITEM_PENDING)
self._pending_transactions = pending_nr
def on_view_switcher_changed(self, view_switcher, action):
logging.debug('view_switcher_activated: %s %s' % (view_switcher, action))
if action == self.NOTEBOOK_PAGE_AVAILABLE:
self.active_pane = self.available_pane
elif action == self.NOTEBOOK_PAGE_INSTALLED:
self.active_pane = self.installed_pane
elif action == self.NOTEBOOK_PAGE_PENDING:
self.active_pane = None
elif not False:
raise AssertionError, 'Not reached'
self.menuitem_view_supported_only.set_sensitive(self.active_pane != None)
self.menuitem_view_all.set_sensitive(self.active_pane != None)
if self.active_pane:
self._block_menuitem_view = True
if self.active_pane.apps_filter.get_supported_only():
self.menuitem_view_supported_only.activate()
else:
self.menuitem_view_all.activate()
self._block_menuitem_view = False
self.notebook_view.set_current_page(action)
self.update_status_bar()
self.update_app_status_menu()
def on_menuitem_install_activate(self, menuitem):
self.active_pane.app_details.install()
def on_menuitem_remove_activate(self, menuitem):
self.active_pane.app_details.remove()
def on_menuitem_close_activate(self, widget):
gtk.main_quit()
def on_menu_edit_activate(self, menuitem):
'''
Check whether the search field is focused and if so, focus some items
'''
if self.active_pane:
state = self.active_pane.searchentry.is_focus()
else:
state = False
edit_menu_items = [
self.menuitem_undo,
self.menuitem_redo,
self.menuitem_cut,
self.menuitem_copy,
self.menuitem_paste,
self.menuitem_delete,
self.menuitem_select_all]
for item in edit_menu_items:
item.set_sensitive(state)
def on_menuitem_undo_activate(self, menuitem):
self.active_pane.searchentry.undo()
def on_menuitem_redo_activate(self, menuitem):
self.active_pane.searchentry.redo()
def on_menuitem_cut_activate(self, menuitem):
self.active_pane.searchentry.cut_clipboard()
def on_menuitem_copy_activate(self, menuitem):
self.active_pane.searchentry.copy_clipboard()
def on_menuitem_paste_activate(self, menuitem):
self.active_pane.searchentry.paste_clipboard()
def on_menuitem_delete_activate(self, menuitem):
self.active_pane.searchentry.set_text('')
def on_menuitem_select_all_activate(self, menuitem):
self.active_pane.searchentry.select_region(0, -1)
def on_menuitem_copy_web_link_activate(self, menuitem):
page = self.notebook_view.get_current_page()
try:
pkg = self._selected_pkgname_for_page[page]
except KeyError:
e = None
return None
clipboard = gtk.Clipboard()
clipboard.set_text(self.WEBLINK_URL % pkg)
def on_menuitem_search_activate(self, widget):
if self.active_pane:
self.active_pane.searchentry.grab_focus()
self.active_pane.searchentry.select_region(0, -1)
def on_menuitem_software_sources_activate(self, widget):
self.window_main.set_sensitive(False)
p = subprocess.Popen([
'gksu',
'--desktop',
'/usr/share/applications/software-properties.desktop',
'--',
'/usr/bin/software-properties-gtk',
'-n',
'-t',
str(self.window_main.window.xid)])
ret = None
while ret is None:
while gtk.events_pending():
gtk.main_iteration()
ret = p.poll()
if ret == 1:
self.run_update_cache()
self.window_main.set_sensitive(True)
def on_menuitem_about_activate(self, widget):
self.aboutdialog.set_version(VERSION)
self.aboutdialog.run()
self.aboutdialog.hide()
def on_menuitem_help_activate(self, menuitem):
p = subprocess.Popen([
'yelp',
'ghelp:software-center'])
glib.timeout_add(1000, (lambda p: p.poll() == None), p)
def on_menuitem_view_all_activate(self, widget):
if self._block_menuitem_view:
return None
self.active_pane.apps_filter.set_supported_only(False)
self.active_pane.refresh_apps()
def on_menuitem_view_supported_only_activate(self, widget):
if self._block_menuitem_view:
return None
self.active_pane.apps_filter.set_supported_only(True)
self.active_pane.refresh_apps()
def _on_trans_finished(self, trans, enum):
'''callback when a aptdaemon transaction finished'''
if enum == aptdaemon.enums.EXIT_FAILED:
excep = trans.get_error()
msg = '%s: %s\n%s\n\n%s' % (_('ERROR'), aptdaemon.enums.get_error_string_from_enum(excep.code), aptdaemon.enums.get_error_description_from_enum(excep.code), excep.details)
print msg
self.cache.open()
def run_update_cache(self):
'''update the apt cache (e.g. after new sources where added '''
aptd_client = aptdaemon.client.AptClient()
trans = aptd_client.update_cache(exit_handler = self._on_trans_finished)
try:
trans.run()
except dbus.exceptions.DBusException:
e = None
if e._dbus_error_name == 'org.freedesktop.PolicyKit.Error.NotAuthorized':
pass
else:
raise
e._dbus_error_name == 'org.freedesktop.PolicyKit.Error.NotAuthorized'
def update_app_status_menu(self):
"""Helper that updates the 'File' and 'Edit' menu to enable/disable
install/remove and Copy/Copy weblink
"""
logging.debug('update_app_status_menu')
page = self.notebook_view.get_current_page()
try:
pkgname = self._selected_pkgname_for_page[page]
except KeyError:
e = None
self.menuitem_install.set_sensitive(False)
self.menuitem_remove.set_sensitive(False)
self.menuitem_copy_web_link.set_sensitive(False)
return False
if not self.cache.ready:
glib.timeout_add((100,), (lambda : self.update_app_status_menu()))
return False
if not self.cache.has_key(pkgname):
self.menuitem_install.set_sensitive(False)
self.menuitem_remove.set_sensitive(False)
self.menuitem_copy_web_link.set_sensitive(False)
if self.cache.has_key(pkgname):
pkg = self.cache[pkgname]
installed = bool(pkg.installed)
self.menuitem_install.set_sensitive(not installed)
self.menuitem_remove.set_sensitive(installed)
else:
self.menuitem_install.set_sensitive(False)
self.menuitem_remove.set_sensitive(False)
return False
def update_status_bar(self):
'''Helper that updates the status bar'''
page = self.notebook_view.get_current_page()
if self.active_pane:
s = self.active_pane.get_status_text()
else:
s = ''
self.label_status.set_text(s)
def _on_database_rebuilding_handler(self, is_rebuilding):
logging.debug('_on_database_rebuilding_handler %s' % is_rebuilding)
self._database_is_rebuilding = is_rebuilding
self.window_rebuilding.set_transient_for(self.window_main)
self.window_rebuilding.set_title('')
self.window_main.set_sensitive(not is_rebuilding)
if is_rebuilding:
self.window_rebuilding.show()
else:
self.db.reopen()
self.window_rebuilding.hide()
def setup_database_rebuilding_listener(self):
'''
Setup system bus listener for database rebuilding
'''
self._database_is_rebuilding = False
try:
bus = dbus.SystemBus()
except:
logging.exception('could not get system bus')
return None
try:
proxy_obj = bus.get_object('com.ubuntu.Softwarecenter', '/com/ubuntu/Softwarecenter')
iface = dbus.Interface(proxy_obj, 'com.ubuntu.Softwarecenter')
res = iface.IsRebuilding()
self._on_database_rebuilding_handler(res)
except Exception:
e = None
logging.debug("query for the update-database exception '%s' (probably ok)" % e)
bus.add_signal_receiver(self._on_database_rebuilding_handler, 'DatabaseRebuilding', 'com.ubuntu.Softwarecenter')
def setup_dbus_or_bring_other_instance_to_front(self):
'''
This sets up a dbus listener
'''
try:
bus = dbus.SessionBus()
except:
logging.exception('could not initiate dbus')
return None
try:
proxy_obj = bus.get_object('com.ubuntu.Softwarecenter', '/com/ubuntu/Softwarecenter')
iface = dbus.Interface(proxy_obj, 'com.ubuntu.SoftwarecenterIFace')
iface.bringToFront()
sys.exit()
except dbus.DBusException:
e = None
bus_name = dbus.service.BusName('com.ubuntu.Softwarecenter', bus)
self.dbusControler = SoftwarecenterDbusController(self, bus_name)
def run(self):
self.window_main.show_all()
SimpleGtkbuilderApp.run(self)